# @Filename:    advancedIndex
# @Author:      王佳伟
# @Time:        2025-03-31 11:13
# @Describe:    高级索引
import numpy as np

# 整数索引
# 以下示例获取了ndarray对象中每一行指定列的一个元素。 因此，行索引包含所有行号，列索引指定要选择的元素。

x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0, 1, 2], [0, 1, 0]]
print(y)

# 下面的示例获取了 4X3 数组中的每个角处的元素。 行索引是[0,0]和[3,3]，而列索引是[0,2]和[0,2]。
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('我们的数组是：')
print(x)
print('\n')

rows = np.array([[0, 0], [3, 3]])
cols = np.array([[0, 2], [0, 2]])
y = x[rows, cols]
print('这个数组的每个角处的元素是：')
print(y)

print("==================================")

# 高级和基本索引可以通过使用切片:或省略号...与索引数组组合。
# 以下示例使用slice作为列索引和高级索引。
# 当切片用于两者时，结果是相同的。 但高级索引会导致复制，并且可能有不同的内存布局。
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('我们的数组是：')
print(x)
print('\n')

# 切片
z = x[1:4, 1:3]
print('切片之后，我们的数组变为：')
print(z)
print('\n')

# 对列使用高级索引
y = x[1:4, [1, 2]]
print('对列使用高级索引来切片')
print(y)

print("==================================")

# 布尔索引
# 当结果对象是布尔运算（例如比较运算符）的结果时，将使用此类型的高级索引。
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('我们的数组是：')
print(x)
print('\n')

# 现在我们会打印出大于5的元素
print('大于5的元素是：')
print(x[x > 5])

# 下面这个例子使用了~（取补运算符）来过滤NaN。
a = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
print(a[~np.isnan(a)])

# 以下示例显示如何从数组中过滤掉非复数元素。
a = np.array([1, 2+6j, 5, 3.5+5j])
print(a[np.iscomplex(a)])




